package repo

import (
	"errors"
	"lsgfish/server/internal/dto/request"
	"lsgfish/server/internal/dto/response"
	"lsgfish/server/internal/model"
	"lsgfish/server/internal/tool"
)

type userRepository struct{}

type UserRepository interface {
	// 用户基本信息相关方法
	Register(req *model.User) error
	Query(account string) (model.User, error)
	SendVerificationCode(email string) error
	ValidateToken(token string) (*model.User, error)
	Updates(user model.User) error

	// 用户管理相关方法
	PaginationList(params request.UserPaginationParams) (response.UserPaginationResult, error)
	Update(user model.User) error
	Add(user model.User) error
	Delete(id int) error
}

func NewUserRepository() UserRepository {
	return &userRepository{}
}

func (u *userRepository) Updates(user model.User) error {
	return tool.DB.Model(&user).Updates(user).Error
}

// Register 实现用户注册
func (u *userRepository) Register(req *model.User) error {
	var count int64
	// 查询账户是否存在
	if err := tool.DB.Model(&model.User{}).Where("account = ?", req.Account).Count(&count).Error; err != nil {
		return err
	}

	if count > 0 {
		return errors.New("账号已存在")
	}
	// 如果存在邀请码，查询邀请码用户
	if req.InviteCode != "" {
		var inviteUser model.User
		if err := tool.DB.Where("invite_code = ?", req.InviteCode).First(&inviteUser).Error; err != nil {
			return err
		}
		req.InviteId = inviteUser.Id
	}
	// 保存用户信息
	if err := tool.DB.Create(req).Error; err != nil {
		return err
	}

	return nil
}

// 查询用户信息
func (u *userRepository) Query(account string) (model.User, error) {
	user := model.User{}
	err := tool.DB.Where("account = ?", account).First(&user).Error
	return user, err
}

// SendVerificationCode 发送验证码
func (u *userRepository) SendVerificationCode(email string) error {
	return nil
}

// ValidateToken 验证token
func (u *userRepository) ValidateToken(token string) (*model.User, error) {
	return nil, nil
}

// 更新用户信息
func (u *userRepository) Update(user model.User) error {
	return tool.DB.Save(&user).Error
}

// 分页查询用户列表
func (u *userRepository) PaginationList(params request.UserPaginationParams) (result response.UserPaginationResult, err error) {
	// 初始化数据
	result.Data = []response.UserManageResult{}
	// 基础查询
	query := tool.DB.Model(&model.User{})

	// 模糊查询条件
	// 账号
	if params.Account != "" {
		query = query.Where("account like ?", "%"+params.Account+"%")
	}
	// 昵称
	if params.NickName != "" {
		query = query.Where("nick_name like ?", "%"+params.NickName+"%")
	}
	// // 角色
	// if params.Role != "" {
	// 	query = query.Where("role = ?", params.Role)
	// }
	// 先根据条件查询总数目
	if err = query.Count(&result.Total).Error; err != nil || result.Total == 0 {
		return
	}

	// 分页查询
	// 除了分页参数之外，其他参数都参与查询TODO:个别参数进行模糊查询
	if err = query.Offset((params.CurrentPage - 1) * params.PageSize).Limit(params.PageSize).Find(&result.Data).Error; err != nil {
		return
	}
	return
}

// 添加用户
func (u *userRepository) Add(user model.User) error {
	return tool.DB.Create(&user).Error
}

// 删除用户
func (u *userRepository) Delete(id int) error {
	return tool.DB.Delete(&model.User{}, id).Error
}
